package com.suwish.pc.phone;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.android.ddmlib.IDevice;
import com.suwish.pc.Setting;
import com.suwish.pc.adb.Adb;
import com.suwish.pc.adb.AdbManager;
import com.suwish.pc.adb.Command;
import com.suwish.pc.ddms.DdmsManager;
import com.suwish.pc.event.AdbEvent;
import com.suwish.pc.event.PhoneEvent;
import com.suwish.pc.event.PhoneListener;
import com.suwish.pc.ui.preference.PreferenceManager;
import com.suwish.pc.util.StringUtils;

/**
 * 
 * <b>PhoneManager</b>顾名思义，就是对{@link Phone}的管理，{@link Phone}是对
 * Android电话设备的抽象，向上提供用户界面使用，向下封装设备的连接和通信方式。
 * 目前设计的通信方式有三种，ADB、USB-SOCKET、DDMS。</p>
 * 
 * 三种通信方各有优缺点.
 * 
 * @author Min
 * @version 0.1 此版本基本消除<code>PhoneManager</code>的所有作用，而仅仅作为一个
 * 系统的调用核心使用，并取消{@link Phone}设计之初的目的，本版本所有操作和事件完全依赖于
 * DDMS完成。下一个版本将使用USB-SOCKET和ADB配合的方式，并将{@link IDevice}和ADB都纳入
 * {@link Phone}对象管理。因此当前版本关于<code>Phone</code>的方法和操作都可视为无效和
 * 不提倡的。鉴于此，所有的的操作都归入相应的Manager完成，<code>PhoneManager</code>仅仅
 * 负责管理这些Manager和提供一些工具方法。
 */
public final class PhoneManager {

	private static PhoneManager manager = null;
	
	private AdbManager adbManager = null;
	
	private DdmsManager ddmsManager = null;
	private PreferenceManager perferenceManager = null;
	
	private List<Phone> phones = new ArrayList<Phone>();
	private List<PhoneListener> listeners = new ArrayList<PhoneListener>();
	/**
	 * 
	 * 单例
	 * @return
	 */
	public static synchronized PhoneManager getInstance(){
		return manager == null ? (manager = new PhoneManager()) : manager;
	}
	
	public synchronized AdbManager getAdbManager(){
		return adbManager == null ? (adbManager = new AdbManager(this)) : adbManager;
	}
	public synchronized PreferenceManager getPerferenceManager(){
		return perferenceManager == null ? perferenceManager = new PreferenceManager() : perferenceManager;
	}
	public DdmsManager getDdmsManager(){
		return ddmsManager; 
	}
	
	public void initEvt(){
		
	} 
	
	private PhoneManager(){
		init();
	}
	
	private void init(){
		ddmsManager = new DdmsManager();
		ddmsManager.startDdmsAndWaitTimeOut();
	}
//	public Adb createAdb(){}
	/**
	 * 
	 * @deprecated
	 */
	void firePhoneConnect(PhoneEvent event){
		for(PhoneListener l : listeners){
//			if(!l.acceptEvent(event)) continue;
			l.phoneConnect(event);
		}
	}
	/**
	 * 
	 * @deprecated
	 * 
	 */
	void firePhoneDisconnect(PhoneEvent event){
		for(PhoneListener l : listeners){
//			if(!l.acceptEvent(event)) continue;
			l.phoneDisconnection(event);
		}
	}
	/**
	 * 
	 * @param phone
	 * @deprecated
	 */
	public void closeConnect(Phone phone){
		
	}
	/**
	 * 退出系统，在此将销毁一些系统资源。
	 * 
	 */
	public void exitSystem(){
		ddmsManager.stopDdmsManager();
		Setting.saveConfiguration();
		System.exit(0);
	}
	/**
	 * 
	 * @param serialNumber
	 * @return
	 * @throws IOException 
	 */
	public static Process callShell(String serialNumber) throws IOException{
		return AdbManager.execCommand(new Command(AdbManager.ADB_PATH, " -s " + serialNumber + " shell"));
	}
	public static String execCommand(String command) throws IOException{
		return AdbManager.queryResult(new Command(AdbManager.ADB_PATH, command), true);
		
	}
	/**
	 * 
	 * @param serialNumber
	 * @return
	 * @deprecated
	 */
	public Phone connectBySerialNumber(String serialNumber){
		return null;
	}
	/**
	 * 
	 * @param adb
	 * @return
	 * @deprecated
	 */
	public Phone getPhone(Adb adb){
		if(StringUtils.isEmpty(adb.getSeroalNo())) return null;
		for(Phone phone : phones){
			if(phone.getAdb().getSeroalNo().equals(adb.getSeroalNo())) return phone;
		}
		return null;
	}
	/**
	 * 
	 * @param serialNumber
	 * @return
	 * @deprecated
	 */
	public Phone getPhone(String serialNumber){
		if(StringUtils.isEmpty(serialNumber)) return null;
		for(Phone phone : phones){
			if(serialNumber.equals(phone.getSerialNumber())) return phone;
		}
		return null;
	}
	/**
	 * 
	 * @param l
	 * @deprecated
	 */
	public void addConnectListener(PhoneListener l){
		if(listeners.contains(l)) return;
		listeners.add(l);
	}
	/**
	 * 
	 * @param l
	 * @return
	 * @deprecated
	 */
	public boolean removeConnectListener(PhoneListener l){
		return listeners.remove(l);
	}
}
